home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / graphicgems4.lha / GemsIV / vox_traverse.c < prev   
Encoding:
Text File  |  1995-02-06  |  926 b   |  45 lines

  1. /*
  2.  * C code from the article
  3.  * "Voxel Traversal along a 3D Line"
  4.  * by Daniel Cohen, danny@bengus.bgu.ac.il
  5.  * in "Graphics Gems IV", Academic Press, 1994
  6.  */
  7.  
  8. /* The following C subroutine visits all voxels along the line
  9. segment from (x, y, z) and (x + dx, y + dy, z + dz) */
  10.  
  11. Line ( x, y, z, dx, dy, dz )
  12. int x, y, z, dx, dy, dz;
  13. {
  14.     int n, sx, sy, sz, exy, exz, ezy, ax, ay, az, bx, by, bz;
  15.  
  16.     sx = sgn(dx);  sy = sgn(dy);  sz = sgn(dz);
  17.     ax = abs(dx);  ay = abs(dy);  az = abs(dz);
  18.     bx = 2*ax;       by = 2*ay;      bz = 2*az;
  19.     exy = ay-ax;   exz = az-ax;      ezy = ay-az;
  20.     n = ax+ay+az;
  21.     while ( n-- ) {
  22.     VisitVoxel ( x, y, z );
  23.     if ( exy < 0 ) {
  24.         if ( exz < 0 ) {
  25.         x += sx;
  26.         exy += by; exz += bz;
  27.         }
  28.         else  {
  29.         z += sz;
  30.         exz -= bx; ezy += by;
  31.         }
  32.     }
  33.     else {
  34.         if ( ezy < 0 ) {
  35.         z += sz;
  36.         exz -= bx; ezy += by;
  37.         }
  38.         else  {
  39.         y += sy;
  40.         exy -= bx; ezy -= bz;
  41.         }
  42.     }
  43.     }
  44. }
  45.